List-Ereignisse aus ALV
Hin und wieder stolpert man einfach über kleinere oder größere Fallen im SAP-System. So auch dann, wenn man aus dem REUSE-ALV-Grid abspringt um eine Listausgabe zu machen und meint, man könne von dort die guten alten Verzweigungslisten nutzen (AT LINE-SELETION). Weit gefehlt, denn…
Aber fangen wir noch mal von vorne an: Folgendes kleine Programm gibt mithilfe des REUSE-ALV-Grid-Bausteins eine ALV-Grid-Liste aus. Per Doppelklick kann man Details zu einem Eintrag anzeigen lassen. Diese Details werden als einfache Liste ausgegeben. Zugegeben, modern ist das nicht, aber die Listausgabe hat auch ihre Vorteile: Sie ist flexibel und lässt sich ohne Feldkatalog darstellen.
Coding Eins
REPORT.
TYPE-POOLS slis.
DATA gt_data TYPE STANDARD TABLE OF t005t.
DATA gs_data TYPE t005t.
DATA gv_fieldname TYPE c LENGTH 40.
DATA gv_fieldvalue TYPE c LENGTH 40.
SELECT-OPTIONS: s_land1 FOR gs_data-land1.
*** Duble click in list ***
AT LINE-SELECTION.
*** field values
GET CURSOR FIELD gv_fieldname VALUE gv_fieldvalue.
CASE sy-lsind.
WHEN 1.
WRITE: / 'Mehr Informationen zu Land', gs_data-landx HOTSPOT ON.
ENDCASE.
*** Start of program ***
START-OF-SELECTION.
PERFORM selection.
PERFORM display.
*&---------------------------------------------------------------------*
*& Form selection
*&---------------------------------------------------------------------*
FORM selection.
SELECT * FROM t005t INTO TABLE gt_data
WHERE land1 IN s_land1
AND spras = sy-langu.
ENDFORM. "selection
*&---------------------------------------------------------------------*
*& Form display
*&---------------------------------------------------------------------*
FORM display.
*** Data
DATA lt_fcat TYPE lvc_t_fcat.
FIELD-SYMBOLS <fcat> TYPE lvc_s_fcat.
*** get fieldcatalog
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_buffer_active = space
i_structure_name = 'T005T'
i_client_never_display = 'X'
i_bypassing_buffer = 'X'
CHANGING
ct_fieldcat = lt_fcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
*** set hotspot and colours
LOOP AT lt_fcat ASSIGNING <fcat>.
IF <fcat>-fieldname = 'LAND1'.
<fcat>-hotspot = 'X'.
<fcat>-emphasize = 'C400'.
ENDIF.
ENDLOOP.
*** display
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_bypassing_buffer = 'X'
i_buffer_active = space
i_callback_program = sy-cprog
i_callback_user_command = 'CALLBACK_ALV_USERCOMMAND'
it_fieldcat_lvc = lt_fcat
TABLES
t_outtab = gt_data
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. "anzeige
*&---------------------------------------------------------------------*
*& Form callback_alv_usercommand
*&---------------------------------------------------------------------*
FORM callback_alv_usercommand
USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&IC1'.
READ TABLE gt_data INTO gs_data INDEX rs_selfield-tabindex.
IF sy-subrc = 0.
LEAVE TO LIST-PROCESSING.
SET PF-STATUS space.
WRITE: / 'Land', gs_data-landx HOTSPOT ON.
ENDIF.
ENDCASE.
ENDFORM. "callback_alv_usercommand
Warum funktioniert der Doppelklick in der Liste nicht?
Wenn Sie das Programm ausführen, werden Sie merken, dass der Doppelklick aus dem ALV wunderbar funktioniert. Auch die Listausgabe funktioniert einwandfrei. Doch obwohl wir die Zeile mit “HOTSPOT ON” ausgeben, was normalerweise das Ereignis “AT LINE-SELECTION” aktiviert, klappt dies nicht mehr.
Die Lösung
Wenn Sie über das Menü “System – Status” schauen, dann werden Sie feststellen, dass Sie sich entweder “in gar keinem Programm mehr befinden” oder in der Funktionsgruppe des Reuse-Bausteins SAPLSLVC_FULLSCREEN.
Sie springen zwar in die Routine CALLBACK_ALV_USERCOMMAND, allerdings hat sich das Hauptprogramm durch den Aufruf des Funktionsbausteins geändert.
Dies ist auch der Grund, warum AT LINE-SELECTION nicht funktioniert, denn hier haben Sie das Coding ja nicht hinterlegt, sondern in Ihrem Programm.
Was also tun: Die Lösung ist: Sie müssen dafür sorgen, dass sie bei der Listausgabe in Ihrem Programm bleiben bzw. in Ihre Programm zurück kehren.
Das tun Sie, indem Sie die Liste nicht im CALLBACK_ALV_USERCOMMAND ausgebene, sondern mithilfe von CALL SCREEN in ein Dynpro Ihres Programms springen:
Coding Zwei
Ersetzen Sie die Callbackroutine:
*&---------------------------------------------------------------------* *& Form callback_alv_usercommand *&---------------------------------------------------------------------* FORM callback_alv_usercommand USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. CASE r_ucomm. WHEN '&IC1'. READ TABLE gt_data INTO gs_data INDEX rs_selfield-tabindex. IF sy-subrc = 0. CALL SCREEN 100. ENDIF. ENDCASE. ENDFORM. "callback_alv_usercommand Dafür müssen Sie aber natürlich das Dynpro 100 anlegen. tun Sie das und implementieren Sie die folgenden beiden in der Ablauflogik verwendeten Module: Ablauflogik PROCESS BEFORE OUTPUT. MODULE status_0100. * PROCESS AFTER INPUT. MODULE user_command_0100. PBO + PAI *&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT *&---------------------------------------------------------------------* MODULE status_0100 OUTPUT. SUPPRESS DIALOG. ENDMODULE. " STATUS_0100 OUTPUT *&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* MODULE user_command_0100 INPUT. CASE sy-ucomm. WHEN 'BACK' OR '%EX' OR 'RW'. SET SCREEN 0. LEAVE SCREEN. WHEN OTHERS. LEAVE TO LIST-PROCESSING. SET PF-STATUS space. WRITE: / 'Land', gs_data-landx HOTSPOT ON. ENDCASE. ENDMODULE. " USER_COMMAND_0100 INPUT
Erklärung
Durch SUPPRESS DIALOG wird das PBO übersprungen und es wird sofort in das PAI verzweigt. Hier erfolgt ein LEAVE TO LIST-PROCESSING um eine Liste ausgeben zu können.
Der “SET-PF-STATUS space” muss sein, um den Standard-List-Status zu verwenden. Ansonsten wäre noch der Status des ALV-Grid aktiv.
Nun befinden wir uns wieder in unserem Programm und AT LINE-SELECTION wird durchlaufen.
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024